package com.java.simple.study.juc.p2;

import com.java.simple.study.tool.Sleeper;
import lombok.extern.slf4j.Slf4j;

/**
 * @author zhoujunlin
 * @date 2022年04月05日 17:19
 * @desc
 */
@Slf4j(topic = "c.TestState")
public class TestState {

    public static void main(String[] args) {
        // 创建 不启动  NEW（创建 不会被调度器调度）
        Thread t1 = new Thread("t1") {
            @Override
            public void run() {
                log.debug("running...");
            }
        };

        // 一直运行  RUNNABLE（包括可被调度、已被调度、io阻塞）
        Thread t2 = new Thread("t2") {
            @Override
            public void run() {
                while (true) {

                }
            }
        };
        t2.start();

        // 运行完立即结束 （TERMINATED）
        Thread t3 = new Thread("t3") {
            @Override
            public void run() {
                log.debug("running...");
            }
        };
        t3.start();

        // 运行等待 （TIMED_WAITING）
        Thread t4 = new Thread("t4") {
            @Override
            public void run() {
                synchronized (TestState.class) {
                    Sleeper.sleep(1000000000);
                }
            }
        };
        t4.start();

        // 等待不可能结束的线程t2执行完 WAITING
        Thread t5 = new Thread("t5") {
            @Override
            public void run() {
                try {
                    t2.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        t5.start();

        // BLOCKED
        Thread t6 = new Thread("t6") {
            @Override
            public void run() {
                // 当前锁被线程t4持有 暂时获取不到 阻塞
                synchronized (TestState.class) {
                    Sleeper.sleep(100000000);
                }
            }
        };
        t6.start();

        Sleeper.sleep(1);
        log.debug("t1 state:{}", t1.getState());
        log.debug("t2 state:{}", t2.getState());
        log.debug("t3 state:{}", t3.getState());
        log.debug("t4 state:{}", t4.getState());
        log.debug("t5 state:{}", t5.getState());
        log.debug("t6 state:{}", t6.getState());

    }


}
